class Solution {
    public int deleteAndEarn(int[] nums) {
        int n = nums.length;
        // 统计每个数字出现的总和，相邻的数字不能选，即变成一个打家劫舍的问题
        int[] arr = new int[10001];
        for(int i = 0; i < n; i++){
            int pos = nums[i];
            arr[pos] += pos;
        }
        // 确定状态表示 - 选 i 位置的最大点数  /  不选 i 位置的最大点数
        int[] f = new int[10001];
        int[] g = new int[10001];
        // 初始化
        f[0] = 0;
        g[0] = 0;
        // 确定状态转移方程
        for(int i = 1; i < 10001; i++){
            f[i] = g[i - 1] + arr[i];
            g[i] = Math.max(f[i - 1], g[i - 1]);
        }
        return Math.max(f[10000], g[10000]);
    }
}